package org.example.ch16;

/**
 * <p>
 * Description:TODO 详细描述
 * <p>
 * Copyright: 天津联想协同科技有限公司
 * <p>
 *
 * @author anlu
 * @date 2022/2/23 9:56
 */
public class BitsDemo {

    public static void main(String[] args) {
//        int result = 1 << 10;
//        System.out.println(result);

        BitsDemo bitsDemo = new BitsDemo();
//        bitsDemo.yiHuo();
//          bitsDemo.zuoYi();
//        bitsDemo.yu();
//        bitsDemo.youYi();
//        bitsDemo.test1();
        bitsDemo.test2();
    }


    public void test2(){
        //&,|,^,~
           int a = 3;
           int b = 4;

           System.out.println("3 & 4 ="+(3 & 4));
           System.out.println("3 | 4 =" +(3 | 4));
           System.out.println("3 ^ 4 = "+(3 ^ 4));
           System.out.println("~3="+(~3));
    }

    /**
     * .^(亦或运算) ，针对二进制，相同的为0，不同的为1
     */
    private void yiHuo(){
        System.out.println("2^3的运算结果为:"+(6^10));
        //打印的结果为1
        /**
         *  如果第一个数是A，第二个数是B，
         *  如果A<B,则A^B = B + A;
         *  如果A>B,则A^B = A - B;
         *  如果A=B,则A^B = 0;
         */

    }

    /**
     * &（与运算） 针对二进制，只要有一个为0，就为0
     */
    private void yu(){
        System.out.println("6&3运算的结果是 :"+(10&5));
        //打印的结果是:   2&3运算的结果是 :2
    }

    /**
     * .<<(向左位移) 针对二进制，转换成二进制后向左移动3位，后面用0补齐
     */
    private void zuoYi(){
        System.out.println("2<<3运算的结果是 :"+(1<<3));
        //打印的结果是:   2<<3运算的结果是 :16
    }

    /**
     * >>(向右位移) 针对二进制，转换成二进制后向右移动3位，
     */
    private void youYi(){
        System.out.println("2>>3运算的结果是 :"+(4>>1));
        //打印的结果是:   2>>3运算的结果是 :0
    }

    /**
     * >>>(无符号右移)  无符号右移，忽略符号位，空位都以0补齐
     * >>>与>>唯一的不同是它无论原来的最左边是什么数，统统都用0填充。
     * ——比如，byte是8位的，-1表示为byte型是11111111(补码表示法）
     * b>>>4就是无符号右移4位，即00001111，这样结果就是15。
     */
    private void wuFuhaoYouYi(){
        System.out.println("16>>2运算的结果是 :"+((16)>>2));
        //打印的结果是:   16>>2运算的结果是 :4

        System.out.println("-16>>2运算的结果是 :"+((-16)>>2));
        //打印的结果是:   -16>>2运算的结果是 :-4

        System.out.println("16>>>2运算的结果是 :"+((16)>>>2));
        //打印的结果是:   16>>>2运算的结果是 :4

        System.out.println("-16>>>2运算的结果是 :"+((-16)>>>2));
        //打印的结果是:   -16>>>2运算的结果是 :1073741820
    }

    private void test1(){
        int subset = 0;
        System.out.println(subset |= (1 << 3));
    }

    /**
     * 关于 |= 运算符：|= 运算符和 += 这一类的运算符一样，拆解开就是 a = a | b；
     * 具体规则为：两个二进制对应位为0时该位为0，否则为1。拿5的二进制 0000 0101 和 3的二进制 0000 0011 进行|运算，
     * 后三位的的对应位都不是同时等于0，所以最终结果为 0000 0111 也就是7的二进制。
     */
    public void test01(){
        // 0000 0101
        int a = 5;
        // 0000 0011
        int b = 3;
        // 0000 0111
        a |= b;
        System.out.println(a);
    }

    /**
     * &=
     * &= 和 |= 基本是一样的，只不过对于比较同位方式不同。
     * 具体规则为：两个二进制对应位都为1时，结果为1，否则结果为都0。拿5的二进制 0000 0101
     * 和 3的二进制 0000 0011 进行&运算，只有最后一位都为1，则最终结果为 0000 0001 也就是1的二进制。
     */
    public void test02(){
        // 0000 0101
        int a = 5;
        // 0000 0011
        int b = 3;
        // 0000 0001
        a &= b;
        System.out.println(a);
    }

    /**
     * ^=
     * 具体规则为：两个二进制对应位相同时，结果为0，否则结果为1。
     * 拿5的二进制 0000 0101 和 3的二进制 0000 0011 进行^运算，1-5位对应位都是0所以1-5位都为0，
     * 第8位都为1所以第8位也为0，其他的对应位都不相等所以为1，则最终结果为 0000 0110 也就是6的二进制。
     */
    public void test03(){
        // 0000 0101
        int a = 5;
        // 0000 0011
        int b = 3;
        // 0000 0110
        a ^= b;
        System.out.println(a);
    }

    /**
     * 总结：
     *
     * |=：两个二进制对应位都为0时，结果等于0，否则结果等于1；
     *
     * &=：两个二进制的对应位都为1时，结果为1，否则结果等于0；
     *
     * ^=：两个二进制的对应位相同，结果为0，否则结果为1。
     */



}
